package com.example.mark.common;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * 泛型类 Result<D>，用于封装服务层的返回信息。
 * 该类定义了服务响应的通用结构，包括状态码、消息和数据。
 *
 * Integer code 编码：表示响应的状态码，通常用于指示操作的成功与否。
 * String msg 提示信息：提供对响应状态码的文本描述，可以是成功消息或错误信息。
 * D data 数据：泛型数据字段，用于封装返回给客户端的实际数据。
 * Map map 动态数据：一个HashMap，用于存储额外的键值对数据，允许在响应中添加自定义信息。
 *
 * 该类提供了静态方法来创建成功或错误的响应实例，以及一个实例方法来添加动态数据。
 */
@Data
public class Result<D> {

    private Integer code; // 返回编码：用于表示操作结果的状态码，例如200表示成功。

    private String msg; // 提示信息：包含操作结果的文本描述，用于前端显示或日志记录。

    private D data; // 数据：包含操作返回的具体数据，可以是任何类型。

    private Map map = new HashMap(); // 动态数据：一个HashMap，用于存储额外的键值对数据。

    /**
     * 创建并返回一个表示成功操作的Result实例。
     *
     * @param object 成功操作返回的数据。
     * @return 包含成功状态和数据的结果对象。
     */
    public static <D> Result<D> success(D object) {
        Result<D> result = new Result<D>();
        result.data = object;
        result.code = 1; // 表示成功。
        return result;
    }

    /**
     * 创建并返回一个表示错误操作的Result实例。
     *
     * @param object 失败操作返回的数据。
     * @return 包含错误状态和信息的结果对象。
     */
    public static <D> Result<D> error(D object) {
        Result<D> result = new Result<D>();
        result.data = object;
        result.code = 0; // 表示失败。
        return result;
    }

    /**
     * 向Result实例中添加额外的键值对数据。
     *
     * @param key 键名称。
     * @param value 对应的值。
     * @return 当前Result实例，便于链式调用。
     */
    public Result<D> addMap(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

    /**
     * 向Result实例中添加额外的键值对数据。
     *
     * @param msg 提示信息。
     * @return 当前Result实例。
     */
    public Result<D> addMsg(String msg) {
        this.msg = msg;
        return this;
    }
}
